﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FrameworkLib.Filters;
using GestionePolveri2.DAL;
using LinqKit;
using System.Data.Objects;

namespace GestionePolveriLib.BL.FilterBags
{
    public class ReportTracciabilitaFilterBag : FilterBase<Movimenti>, IFilterBase
    {
        public string Operatore { get; set; }
        public int[] Impianto { get; set; }
        public string CodiceLotto { get; set; }
        public int[] Causale { get; set; }
        public string Famiglia { get; set; }
        public string CodicePolvere { get; set; }
        public string ColoriAbbinati { get; set; }
        public string Fornitore { get; set; }

        public ReportTracciabilitaFilterBag()
        {
            Operatore = null;
            Impianto = null;
        }

        public override System.Linq.Expressions.Expression<Func<Movimenti, bool>> SetUpFilter()
        {
            var predicate = PredicateBuilder.True<Movimenti>();

            if (this.UseDates)
            {
                // aggiungi al filtro il controllo sulla data...
                predicate = predicate.And(im => (EntityFunctions.TruncateTime(im.DataMovimento) >= EntityFunctions.TruncateTime(this.PeriodFrom)) &&
                                                 EntityFunctions.TruncateTime(im.DataMovimento) <= EntityFunctions.TruncateTime(this.PeriodTo));
            }

            if (Fornitore != null)
            {
                predicate = predicate.And(im => im.AnagPolveri.AnagFornitori.Descrizione == Fornitore);
            }

            if (CodicePolvere != null)
            {
                predicate = predicate.And(im => im.AnagPolveri.CodicePolvere == CodicePolvere);
            }

            //if (!string.IsNullOrWhiteSpace(Famiglia))
            //{
            //    string[] arInfo = Famiglia.Split(',');
            //    int[] iarInfo = new int[arInfo.Length];
            //    for (int i = 0; i < arInfo.Length; i++)
            //    {
            //        iarInfo[i] = Convert.ToInt32(arInfo[i]);
            //    }

            //    //predicate = predicate.And(im => im.AnagPolveri.FamiglieColoriXPolveri.Famiglie == Famiglia);
            //    GestionePolveriEntities ctx = new GestionePolveriEntities();
            //    predicate = predicate.And(im => ctx.vw_FamiglieColoriXPolveri.Any(o => o.Famiglia.Equals(Famiglia)));
            //}

            if (!string.IsNullOrWhiteSpace(ColoriAbbinati))
            {
                predicate = predicate.And(im => im.AnagPolveri.ComposizioneColori.Any(x => x.AnagColori.CodiceColore == ColoriAbbinati));
            }

            if (Impianto != null)
            {
                predicate = predicate.And(im => Impianto.Contains(im.Impianti.IDImpianto));
            }

            if (!string.IsNullOrWhiteSpace(CodiceLotto))
            {
                predicate = predicate.And(im => im.Lotti.CodLotto == CodiceLotto);
            }

            if (Causale != null)
            {
                predicate = predicate.And(im => Causale.Contains(im.CausaliMagazzino.IDCausale));
            }

            if (!string.IsNullOrWhiteSpace(Operatore))
            {
                predicate = predicate.And(im => im.aspnet_Users.UserName == Operatore);
            }

            return predicate;
        }

        public override string ToTraceString()
        {
            string retValue = base.ToTraceString();

            StringBuilder sb = new StringBuilder(base.ToTraceString());

            sb.Append(FilterBagHelper.GetCausaleMagazzinoTraceString(this.Causale));
            sb.Append(FilterBagHelper.GetCodiceLottoTraceString(this.CodiceLotto));
            sb.Append(FilterBagHelper.GetCodicePolvereTraceString(this.CodicePolvere));
            sb.Append(FilterBagHelper.GetCodiceColoreTraceString(this.ColoriAbbinati));
            sb.Append(FilterBagHelper.GetFamigliaTraceString(this.Famiglia));
            sb.Append(FilterBagHelper.GetFornitoreTraceString(this.Fornitore));
            sb.Append(FilterBagHelper.GetImpiantoTraceString(this.Impianto));
            sb.Append(FilterBagHelper.GetOperatoreTraceString(this.Operatore));


            return sb.ToString();
        }
    }
}
